package com.bbz.spring.config;

import com.bbz.spring.bean.Car;
import com.bbz.spring.bean.Cat;
import com.bbz.spring.bean.Fish;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * Bean的生命周期
 *       创建----初始化---销毁
 *
 *  第一种方法1：指定Bean的初始化和销毁方法
 *      通过@Bean(initMethod = "init",destroyMethod = "destroy") init,destroy是Bean里定义的方法名
 *      单实例Bean,初始化在容器创建Bean后执行，销毁在容器关闭时执行
 *      多实例Bean,初始化在每次调用时初始化，容器关闭时也并不会销毁Bean,销毁Bean需要自己调用销毁方法。
 *  第二种方法2：通过Bean实现InitializingBean(定义初始化方法),
 *             通过Bean实现DisposableBean(定义销毁方法)
 *  第三种方法3：可以使用JSR250,Java规范
 *              利用@PostConstrut,在bean创建完成并且属性赋值完成，来执行初始化方法。
 *              利用@PreDestroy,在容器关闭之前,来执行销毁方法。
 *  第四种方法4：使用BeanPostProcessor 【interface】 ,通过实现BeanPostProcessor 接口实现后置处理器
 *             BeanPostProcessor接口有两个方法需要实现
 *              1:postProcessBeforeInitialization() 在创建对象构造完成后,属性赋值完成后,初始化之前调用的方法
 *              2:postProcessAfterInitialization() 在初始化完成后,调用的方法。
 *              利用BeanPostProcessor 可实现对所有Bean做一些统一的处理
 *
 *       Spring 底层对BeanPostProcessor的使用
 *       例如 ApplicationContextAwareProcessor ，
     *       ApplicationContextAwareProcessor实现BeanPostProcessor接口，
     *       通过postProcessBeforeInitialization（）可以将applicationContext IOC容器注册到ApplicationContextAware 的实现类。
     *       当我们创建的class,实现ApplicationContextAware接口时，就可以获取到IOC 容器了。
 *       例如 @AutoWired,Bean复制，生命周期注解功能等等，都是利用BeanPostProcessor完成的。
 */
@ComponentScan("com.bbz.spring.bean")
@Import(Fish.class)
@Configuration
public class MainConfig3 {

    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }
}
